// Package response
// Title  		result.response.common.go
// Description  统一返回值包
// Author  		alittlexincan@163.com  			2024/07/22 11:36
// update  		alittlexincan@163.com  			2024/07/22 11:36
package response

import (
	"errors"

	"xincan.com.cn/tarot-go/internal/common/constants"
	"xincan.com.cn/tarot-go/internal/common/exception"
)

// Result
// Title    		Result
// Description   	统一结果结构体
// Author      		alittlexincan@163.com         2024/07/22 11:36
// Update      		alittlexincan@163.com         2024/07/22 11:36
// swagger:model  Result
type Result struct {
	// Code 响应编码
	Code int `json:"code" example:"200"`

	// Message 响应信息
	Message string `json:"message" example:"操作成功"`

	// Data 响应数据
	Data interface{} `json:"data,omitempty"`
}

// ResultBuilder
// Title    		ResultBuilder
// Description   	创建统一结果结构体构建器
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Return 			*ResultBuilder								返回统一结果结构体构建器
func ResultBuilder() *Result {
	return &Result{}
}

// WithCode
// Title    		WithCode
// Description   	设置统一结果结构体的编码
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Param    		code 				int						编码
// Return 			*ResultBuilder								返回统一结果结构体构建器
func (result *Result) WithCode(code int) *Result {
	result.Code = code
	return result
}

// WithMessage
// Title    		WithMessage
// Description   	设置统一结果结构体的信息
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Param    		message 				string				信息
// Return 			*ResultBuilder								返回统一结果结构体构建器
func (result *Result) WithMessage(message string) *Result {
	result.Message = message
	return result
}

// WithData
// Title    		WithData
// Description   	设置统一结果结构体的数据
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Param    		data 				interface{}				数据
// Return 			*ResultBuilder								返回统一结果结构体构建器
func (result *Result) WithData(data interface{}) *Result {
	result.Data = data
	return result
}

// Build
// Title    		Build
// Description   	构建统一结果结构体
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Return    		*Result										返回统一结果结构体
func (result *Result) Build() *Result {
	return result
}

// Failure
// Title    		Failure
// Description   	统一返回状态信息
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Param    		err     				error    			异常对象
// Return    		*Result     								返回结果对象
func Failure(err error) *Result {

	var runtime exception.RuntimeError
	if errors.As(err, &runtime) {
		return ResultBuilder().WithCode(runtime.Code()).WithMessage(runtime.Error()).Build()
	}

	// 业务错误, 获取错误码、错误信息
	var business exception.BusinessError
	if errors.As(err, &business) {
		var msg string
		if business.Model() == "" {
			msg = business.Message()
		} else {
			msg = business.Model() + ": " + business.Message()
		}
		return ResultBuilder().WithCode(business.Code()).WithMessage(msg).Build()
	}

	return ResultBuilder().WithCode(constants.Err.Code()).WithMessage(constants.Err.Message()).Build()
}

// Success
// Title    		Success
// Description   	统一结果信息
// Author      		alittlexincan@163.com         				2024/07/22 11:36
// Update      		alittlexincan@163.com         				2024/07/22 11:36
// Param    		data        			interface{}     	结果对象
// Return    		*Result     								返回结果对象
func Success(data interface{}) *Result {
	return ResultBuilder().WithCode(constants.Ok.Code()).WithMessage(constants.Ok.Message()).WithData(data).Build()
}
